#!/usr/bin/env python
# -*- coding: utf-8 -*-


# cgrep v0.2.0a
###################################################################################################
#
# cgrep - редство подсветки шаблона
# 
# примеры использования:
#	сgrep -l 'hello world' menu.h main.c
#
###################################################################################################


colors = [ "\x1b[00;%dm" % f for f in range(30,38) ] + [ "\x1b[01;%dm" % f for f in range(30,38) ]

import sys,os,time,getopt

mark_line=0
mark_color=1
pattern = '!'

def usage():
    print """cgrep Маркировка вхождений (версия 0.0.1)
Используйте cgrep [OPTIONS]... PATTERN [FILE] [...FILE]
Ищет PATTERN в каждом FILE или стандартном вводе и выделяет ее цветом.
Пример: сgrep -l 'hello world' menu.h main.c

Управление подсветкой:
 -l, --mark-line           подсвечивает всю линию
 -s, --mark-space          подсвечивает до первого пробела (*** в данной версии не работает 
 -c, --color=		   COLOR цвет выделения [0-16] (black,red ... white)
"""



    
def getColor(arg):
    """Метод выбора цвета"""
    stringcolor= {'black' : 0 ,'red' : 1,'yellow' : 2,'blue' : 3,'cyan' : 4 ,'silver' : 6 , 'gray': 7 , 'white' : 15 }
    if arg in stringcolor:
	return int(stringcolor[arg])
    else:
	if (int(arg)>=0 and int(arg)<16):
	    return int(arg)
	else:
	    raise "Ошибка выбора цвета"

def mark(line):
    """Метод маркировки текста"""
    global mark_line    
    global mark_color    
    global pattern

    if (line.find(pattern)>-1):
	if mark_line:
	    line = colors[mark_color] + line + colors[7]
	else:
	    line= ''.join([l + colors[mark_color] + pattern + colors[7] for l in line.split(pattern)[:-1]])+line.split(pattern)[-1]
    return line

def cgrepfile(args):
    """Метод обработки файлов"""
    for file in [ open(a,'r') for a in args ]:
	for line in file:
	    sys.stdout.write(mark(line))

	
def cgrepstdout():
    """Метод обработки стандартного ввода"""
    while 1:
	try:
	    line = sys.stdin.readline()
	    if not line: break
	    sys.stdout.write(mark(line))
	except KeyboardInterrupt:	    
	    break

def main():
    try:
	ops,args = getopt.getopt(sys.argv[1:],"hlc:",["help","mark-line","color="])
	if len(args)==0:
    	    usage()
	    sys.exit()
	    
    except getopt.GetoptError, err:
	print str(err)
	usage()
	sys.exit()
    global mark_line    
    global mark_color    
    global pattern
    for o,a in ops:
	if o in ("-h", "--help"):
	    usage()
	    sys.exit()
	if o in ("-l", "--mark-line"):
	    mark_line=1
	if o in ("-c" "--color"):
	    try:
		mark_color=getColor(a)
	    except:
		print "Ошибка в выборе цвета."
		usage()
		sys.exit()	
    pattern = args[0]
    if len(args)>1:
	cgrepfile(args[1:])
    else:
	cgrepstdout()
	
    
	
	    
if (__name__=="__main__"):
    main()